package estadistec.logica;

import estadistec.logica.gestores.IManejable;

import estadistec.logica.tabla.GestorTablas;
import estadistec.logica.tabla.LTabla;
import estadistec.logica.tabla.TipoTabla;

import estadistec.logica.dependencias.IBuscarNodo;
import estadistec.logica.dependencias.Nodo;

import estadistec.logica.gestores.Gestor;

import estadistec.excepciones.ExcepcionNombreSinDefinir;

import estadistec.grafico.GTabla;
import estadistec.grafico.GEscritorio;

/** 
 * El escritorio es un gestor, pero gestiona gestores definidos.
 * Por ahora gestiona tablas. En un futuro cercano gráficas.
 * Para crear nuevos elementos en el escritorio, deben definirse
 * los métodos aquí en el escritorio.
 *
 * 2009-Nov-13: Se incluyen los métodos de la interfaz
 * {@link estadistec.logica.dependencias.IBuscarNodo}.
 */
public class LEscritorio implements IManejable
{

	/** 
	 * Escritorio gráfico que corresponde al actual escritorio lógico.
	 */
	private GEscritorio _gEscritorio;

	/** 
	 * Gestor de las tablas del escritorio.
	 */
	private GestorTablas _gestorTablas;

	/** 
	 * Es el padre de todos los escritorios.
	 */
	private static SuperGestor _superGestor;

	/** 
	 * Identificación del escritorio.
	 */
	private Long _llave;

	/** 
	 * Nombre del escritorio.
	 */
	private String _nombre;

	/** 
	 * Constructor. Asigna la llave y construye el gestor de tablas.
	 * 
	 * @param llave  Identificador.
	 * @param nombre Nombre asignado por el SuperGestor.
	 *
	 */
	public LEscritorio (Long llave, String nombre) {
		this._llave = llave;
		this._nombre = nombre;
		_gestorTablas = new GestorTablas(this);
		if (_superGestor == null)
			_superGestor = SuperGestor.getInstancia();
	}

	/** 
	 * Método para acomodar las ventanas en cascada.
	 */
	public void ordenarCascada() {
		this._gEscritorio.ordenarCascada();
	}

	/** 
	 * Método para acomodar las ventanas en cuadrícula.
	 */
	public void ordenarCuadricula() {
		this._gEscritorio.ordenarCuadricula();
	}

	/** 
	 * Devuelve la llave o identificador del escritorio.
	 */
	public Long getLlave() {
		return _llave;
	}

	/** 
	 * Devuelve el nombre del escritorio actual.
	 */
	public String getNombre() {
		return this._nombre;
	}

	/** 
	 * Define un nombre nuevo para el escritorio.
	 * 
	 * @param nombre Nuevo nombre del escritorio.
	 */
	public void setNombre(String nombre) {
		if (this._nombre == nombre)
			return;
		assert(this._superGestor.existeManejableXNombre(nombre) == false);
		assert(this._superGestor.verificarSintaxisNombre(nombre));
		this._nombre = new String(nombre);
	}

	/** 
	 * Crea una nueva tabla en este escritorio.
	 * 
	 * @param tipo Para los distintos tipos de tabla:
	 * 	- Tabla normal
	 * 	- Tabla resumen
	 * 	- Tabla muestra
	 */
	public LTabla crearTabla(TipoTabla tipo) {
		LTabla lTabla = _gestorTablas.crearLTabla(tipo);
		GTabla gTabla = this._gEscritorio.crearTabla(lTabla);
		lTabla.setGTabla(gTabla);
		return (lTabla);
	}

	/** 
	 * Define el escritorio gráfico relacionado con este.
	 */
	public void setGEscritorio (GEscritorio gEscritorio) 
	{
		assert(this._gEscritorio == null);
		this._gEscritorio = gEscritorio;
	}

	/** 
	 * Uno de los 2 métodos que se utilizan para encontrar un Nodo con
	 * un nombre específico.
	 * 
	 * @param nombres Nombre del Nodo y sus padres.
	 * @param nivel Nivel actual en los nombres.
	 * 
	 * @return Nodo que se busca.
	 */
	public Nodo buscarRaiz(String[] nombres, int nivel) {
		if (nivel == 0)
			return (buscarNodo(nombres, nivel));
		return (_superGestor.buscarRaiz(nombres, nivel-1));
	}

	/** 
	 * Busca un nodo de manera descendente. Lo que hace es pasar de manera
	 * directa la búsqueda al Gestor de Tablas (y en un futuro al resto de
	 * los gestores).
	 * 
	 * @todo Cuando se agreguen más gestores, se deben incluir en la búsqueda.
	 */
	public Nodo buscarNodo(String[] nombres, int nivel) {
		Nodo resp = _gestorTablas.buscarNodo(nombres, nivel);
		// Aquí se deben incluir el resto de los gestores.
		if (resp == null) 
			return (null);
		return (resp);
	}

	public Gestor getGestor() {
		return (this._superGestor);
	}

}
